package com.microservice.base.common.utils;

import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;

import java.io.IOException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/** @Description 访问第三方接口的工具类 @Author shangwen @Date: 2019/6/3 0003--17:03 */
public class HttpClientUtil {
  private static final String ENCODING = "UTF-8";

  public static String post(String url, Map<String, String> paramsMap) {
    CloseableHttpClient client = HttpClients.createDefault();
    String responseText = "";
    CloseableHttpResponse response = null;
    try {
      HttpPost method = new HttpPost(url);
      if (paramsMap != null) {
        List<NameValuePair> paramList = new ArrayList<NameValuePair>();
        for (Map.Entry<String, String> param : paramsMap.entrySet()) {
          NameValuePair pair = new BasicNameValuePair(param.getKey(), param.getValue());
          paramList.add(pair);
        }
        method.setEntity(new UrlEncodedFormEntity(paramList, ENCODING));
      }
      response = client.execute(method);
      HttpEntity entity = response.getEntity();
      if (entity != null) {
        responseText = EntityUtils.toString(entity);
      }
    } catch (Exception e) {
      // log.error("http request failed",e);
    } finally {
      try {
        response.close();
      } catch (Exception e) {
        // log.error("",e);
      }
    }
    return responseText;
  }
  // get方式(url+参数)
  public static String get(String url, Map<String, String> paramsMap) {
    CloseableHttpClient client = HttpClients.createDefault();
    String responseText = "get成功";
    CloseableHttpResponse response = null;
    String getUrl = url;
    try {
      if (paramsMap != null) {
        getUrl = url + "?";
        for (Map.Entry<String, String> param : paramsMap.entrySet()) {
          getUrl += param.getKey() + "=" + URLEncoder.encode(param.getValue(), ENCODING) + "&";
        }
      }
      HttpGet method = new HttpGet(getUrl);
      response = client.execute(method);
      HttpEntity entity = response.getEntity();
      if (entity != null) {
        responseText = EntityUtils.toString(entity);
      }
    } catch (Exception e) {
      e.printStackTrace();
      // log.error("http request failed",e);
    } finally {
      try {
        response.close();
      } catch (Exception e) {
        // log.error("",e);
      }
    }
    return responseText;
  }
  // get(url)
  public static String get(String url) {
    return get(url, null);
  }

  // get方式(url路径带?+参数)
  public static String getwithJson(String url, String jsonObj) {
    CloseableHttpClient client = HttpClients.createDefault();
    String responseText = "成功json";
    CloseableHttpResponse response = null;
    try {
      String getUrl = url;
      getUrl += jsonObj;

      HttpGet method = new HttpGet(getUrl);
      response = client.execute(method);
      HttpEntity entity = response.getEntity();
      if (entity != null) {
        responseText = EntityUtils.toString(entity);
      }
    } catch (Exception e) {
      e.printStackTrace();
      // log.error("http request failed",e);
    } finally {
      try {
        response.close();
      } catch (Exception e) {
        // log.error("",e);
      }
    }
    return responseText;
  }

  // post请求参数为json格式
  public static String HttpPostWithJson(String url, String json) {
    String returnValue = "这是默认返回值，接口调用失败";
    CloseableHttpClient httpClient = HttpClients.createDefault();
    ResponseHandler<String> responseHandler = new BasicResponseHandler();
    try {
      // 第一步：创建HttpClient对象
      httpClient = HttpClients.createDefault();

      // 第二步：创建httpPost对象
      HttpPost httpPost = new HttpPost(url);

      // 第三步：给httpPost设置JSON格式的参数
      StringEntity requestEntity = new StringEntity(json, "utf-8");
      requestEntity.setContentEncoding("UTF-8");
      httpPost.setHeader("Content-type", "application/json");
      httpPost.setEntity(requestEntity);

      // 第四步：发送HttpPost请求，获取返回值
      returnValue = httpClient.execute(httpPost, responseHandler);
      // 调接口获取返回值时，必须用此方法

    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      try {
        httpClient.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
    // 第五步：处理返回值
    return returnValue;
  }

//  @Test
//  public void test(){
//    String s = get("http://ms.do-ok.com:18010/inner/synchronizationDb/v1/getDb?updateTime=2020-11-11&tableName=c_info_teacher");
//    JSONObject jsonObject = JSONObject.parseObject(s);
//    List<InfoTeacher> list = new ArrayList<>();
//    list = jsonObject.getJSONArray("data").toJavaList(InfoTeacher.class);
//    System.out.println("集合大小:"+list.size());
//    System.out.println("11111111111s");
//    for (InfoTeacher infoTeacher : list) {
//        if(infoTeacher.getId()!=null){
//        System.out.println(infoTeacher);
//        }
//    }
//  }
}
